var BMapLib = window.BMapLib = BMapLib || {};
var INFOBOX_AT_TOP = 1,
    INFOBOX_AT_RIGHT = 2,
    INFOBOX_AT_BOTTOM = 3,
    INFOBOX_AT_LEFT = 4;
(function () {
    var b, a = b = a || {
        version: "1.5.0"
    };
    a.guid = "$BAIDU$";
    (function () {
        window[a.guid] = window[a.guid] || {};
        a.lang = a.lang || {};
        a.lang.isString = function (d) {
            return "[object String]" == Object.prototype.toString.call(d)
        };
        a.lang.isFunction = function (d) {
            return "[object Function]" == Object.prototype.toString.call(d)
        };
        a.lang.Event = function (d, e) {
            this.type = d;
            this.returnValue = true;
            this.target = e || null;
            this.currentTarget = null
        };
        a.object = a.object || {};
        a.extend = a.object.extend = function (f, d) {
            for (var e in d) {
                if (d.hasOwnProperty(e)) {
                    f[e] = d[e]
                }
            }
            return f
        };
        a.event = a.event || {};
        a.event._listeners = a.event._listeners || [];
        a.dom = a.dom || {};
        a.dom._g = function (d) {
            if (a.lang.isString(d)) {
                return document.getElementById(d)
            }
            return d
        };
        a._g = a.dom._g;
        a.event.on = function (e, h, j) {
            h = h.replace(/^on/i, "");
            e = a.dom._g(e);
            var i = function (l) {
                    j.call(e, l)
                },
                d = a.event._listeners,
                g = a.event._eventFilter,
                k, f = h;
            h = h.toLowerCase();
            if (g && g[h]) {
                k = g[h](e, h, i);
                f = k.type;
                i = k.listener
            }
            if (e.addEventListener) {
                e.addEventListener(f, i, false)
            } else {
                if (e.attachEvent) {
                    e.attachEvent("on" + f, i)
                }
            }
            d[d.length] = [e, h, j, i, f];
            return e
        };
        a.on = a.event.on;
        a.event.un = function (f, i, e) {
            f = a.dom._g(f);
            i = i.replace(/^on/i, "").toLowerCase();
            var l = a.event._listeners,
                g = l.length,
                h = !e,
                k, j, d;
            while (g--) {
                k = l[g];
                if (k[1] === i && k[0] === f && (h || k[2] === e)) {
                    j = k[4];
                    d = k[3];
                    if (f.removeEventListener) {
                        f.removeEventListener(j, d, false)
                    } else {
                        if (f.detachEvent) {
                            f.detachEvent("on" + j, d)
                        }
                    }
                    l.splice(g, 1)
                }
            }
            return f
        };
        a.un = a.event.un;
        a.dom.g = function (d) {
            if ("string" == typeof d || d instanceof String) {
                return document.getElementById(d)
            } else {
                if (d && d.nodeName && (d.nodeType == 1 || d.nodeType == 9)) {
                    return d
                }
            }
            return null
        };
        a.g = a.G = a.dom.g;
        a.dom._styleFixer = a.dom._styleFixer || {};
        a.dom._styleFilter = a.dom._styleFilter || [];
        a.dom._styleFilter.filter = function (e, h, j) {
            for (var d = 0, g = a.dom._styleFilter, f; f = g[d]; d++) {
                if (f = f[j]) {
                    h = f(e, h)
                }
            }
            return h
        };
        a.string = a.string || {};
        a.string.toCamelCase = function (d) {
            if (d.indexOf("-") < 0 && d.indexOf("_") < 0) {
                return d
            }
            return d.replace(/[-_][^-_]/g, function (e) {
                return e.charAt(1).toUpperCase()
            })
        };
        a.dom.setStyle = function (f, e, g) {
            var h = a.dom,
                d;
            f = h.g(f);
            e = a.string.toCamelCase(e);
            if (d = h._styleFilter) {
                g = d.filter(e, g, "set")
            }
            d = h._styleFixer[e];
            (d && d.set) ? d.set(f, g): (f.style[d || e] = g);
            return f
        };
        a.setStyle = a.dom.setStyle;
        a.dom.setStyles = function (e, f) {
            e = a.dom.g(e);
            for (var d in f) {
                a.dom.setStyle(e, d, f[d])
            }
            return e
        };
        a.setStyles = a.dom.setStyles;
        a.browser = a.browser || {};
        a.browser.ie = a.ie = /msie (\d+\.\d+)/i.test(navigator.userAgent) ? (document.documentMode || +RegExp[
            "\x241"]) : undefined;
        a.dom._NAME_ATTRS = (function () {
            var d = {
                cellpadding: "cellPadding",
                cellspacing: "cellSpacing",
                colspan: "colSpan",
                rowspan: "rowSpan",
                valign: "vAlign",
                usemap: "useMap",
                frameborder: "frameBorder"
            };
            if (a.browser.ie < 8) {
                d["for"] = "htmlFor";
                d["class"] = "className"
            } else {
                d.htmlFor = "for";
                d.className = "class"
            }
            return d
        })();
        a.dom.setAttr = function (e, d, f) {
            e = a.dom.g(e);
            if ("style" == d) {
                e.style.cssText = f
            } else {
                d = a.dom._NAME_ATTRS[d] || d;
                e.setAttribute(d, f)
            }
            return e
        };
        a.setAttr = a.dom.setAttr;
        a.dom.setAttrs = function (f, d) {
            f = a.dom.g(f);
            for (var e in d) {
                a.dom.setAttr(f, e, d[e])
            }
            return f
        };
        a.setAttrs = a.dom.setAttrs;
        a.dom.create = function (f, d) {
            var g = document.createElement(f),
                e = d || {};
            return a.dom.setAttrs(g, e)
        };
        b.undope = true
    })();
    var c = BMapLib.InfoBox = function (f, e, d) {
        this._content = e || "";
        this._isOpen = false;
        this._map = f;
        this._opts = d = d || {};
        this._opts.offset = d.offset || new BMap.Size(0, 0);
        this._opts.boxClass = d.boxClass || "infoBox";
        this._opts.boxStyle = d.boxStyle || {};
        this._opts.closeIconMargin = d.closeIconMargin || "2px";
        this._opts.closeIconUrl = d.closeIconUrl || "close.png";
        this._opts.enableAutoPan = d.enableAutoPan ? true : false;
        this._opts.align = d.align || INFOBOX_AT_TOP
    };
    c.prototype = new BMap.Overlay();
    c.prototype.initialize = function (e) {
        var d = this;
        var g = this._div = a.dom.create("div", {
            "class": this._opts.boxClass
        });
        a.dom.setStyles(g, this._opts.boxStyle);
        g.style.position = "absolute";
        this._setContent(this._content);
        var f = e.getPanes().floatPane;
        f.style.width = "auto";
        f.appendChild(g);
        this._getInfoBoxSize();
        a.event.on(g, "onmousedown", function (h) {
            d._stopBubble(h)
        });
        a.event.on(g, "onmouseover", function (h) {
            d._stopBubble(h)
        });
        a.event.on(g, "click", function (h) {
            d._stopBubble(h)
        });
        a.event.on(g, "dblclick", function (h) {
            d._stopBubble(h)
        });
        return g
    };
    c.prototype.draw = function () {
        this._isOpen && this._adjustPosition(this._point)
    };
    c.prototype.open = function (d) {
        var e = this,
            f;
        if (!this._isOpen) {
            this._map.addOverlay(this);
            this._isOpen = true;
            setTimeout(function () {
                e._dispatchEvent(e, "open", {
                    point: e._point
                })
            }, 10)
        }
        if (d instanceof BMap.Point) {
            f = d;
            this._removeMarkerEvt()
        } else {
            if (d instanceof BMap.Marker) {
                if (this._marker) {
                    this._removeMarkerEvt()
                }
                f = d.getPosition();
                this._marker = d;
                !this._markerDragend && this._marker.addEventListener("dragend", this._markerDragend = function (
                    g) {
                    e._point = g.point;
                    e._adjustPosition(e._point);
                    e._panBox();
                    e.show()
                });
                !this._markerDragging && this._marker.addEventListener("dragging", this._markerDragging =
                    function () {
                        e.hide();
                        e._point = e._marker.getPosition();
                        e._adjustPosition(e._point)
                    })
            }
        }
        this.show();
        this._point = f;
        this._panBox();
        this._adjustPosition(this._point)
    };
    c.prototype.close = function () {
        if (this._isOpen) {
            this._map.removeOverlay(this);
            this._remove();
            this._isOpen = false;
            this._dispatchEvent(this, "close", {
                point: this._point
            })
        }
    };
    c.prototype.enableAutoPan = function () {
        this._opts.enableAutoPan = true
    };
    c.prototype.disableAutoPan = function () {
        this._opts.enableAutoPan = false
    };
    c.prototype.setContent = function (d) {
        this._setContent(d);
        this._getInfoBoxSize();
        this._adjustPosition(this._point)
    };
    c.prototype.setPosition = function (d) {
        this._point = d;
        this._adjustPosition(d);
        this._removeMarkerEvt()
    };
    c.prototype.getPosition = function () {
        return this._point
    };
    c.prototype.getOffset = function () {
        return this._opts.offset
    }, c.prototype._remove = function () {
        var d = this;
        if (this.domElement && this.domElement.parentNode) {
            a.event.un(this._div.firstChild, "click", d._closeHandler());
            this.domElement.parentNode.removeChild(this.domElement)
        }
        this.domElement = null;
        this._isOpen = false;
        this.dispatchEvent("onremove")
    }, a.object.extend(c.prototype, {
        _getCloseIcon: function () {
            var d = "<img src='" + this._opts.closeIconUrl +
                "' align='right' style='position:absolute;right:0px;cursor:pointer;margin:" + this._opts
                .closeIconMargin + "'/>";
            //return d
            return null
        },
        _setContent: function (e) {
            if (!this._div) {
                return
            }
            var d = this._getCloseIcon();
            if (typeof e.nodeType === "undefined") {
                this._div.innerHTML = d + e
            } else {
                this._div.innerHTML = d;
                this._div.appendChild(e)
            }
            this._content = e;
            this._addEventToClose()
        },
        _adjustPosition: function (f) {
            var d = this._getPointPosition(f);
            var e = this._marker && this._marker.getIcon();
            switch (this._opts.align) {
                case INFOBOX_AT_TOP:
                    if (this._marker) {
                        this._div.style.bottom = -(d.y - this._opts.offset.height - e.anchor.height + e
                            .infoWindowAnchor.height) - this._marker.getOffset().height + 2 + "px"
                    } else {
                        this._div.style.bottom = -(d.y - this._opts.offset.height) + "px"
                    }
                    break;
                case INFOBOX_AT_BOTTOM:
                    if (this._marker) {
                        this._div.style.top = d.y + this._opts.offset.height - e.anchor.height + e.infoWindowAnchor
                            .height + this._marker.getOffset().height + "px"
                    } else {
                        this._div.style.top = d.y + this._opts.offset.height + "px"
                    }
                    break
            }
            if (this._marker) {
                this._div.style.left = d.x - e.anchor.width + this._marker.getOffset().width + e.infoWindowAnchor
                    .width - this._boxWidth / 2 + "px"
            } else {
                this._div.style.left = d.x - this._boxWidth / 2 + "px"
            }
        },
        _getPointPosition: function (d) {
            this._pointPosition = this._map.pointToOverlayPixel(d);
            return this._pointPosition
        },
        _getInfoBoxSize: function () {
            this._boxWidth = parseInt(this._div.offsetWidth, 10);
            this._boxHeight = parseInt(this._div.offsetHeight, 10)
        },
        _addEventToClose: function () {
            var d = this;
            a.event.on(this._div.firstChild, "click", d._closeHandler());
            this._hasBindEventClose = true
        },
        _closeHandler: function () {
            var d = this;
            return function (f) {
                d.close()
            }
        },
        _stopBubble: function (d) {
            if (d && d.stopPropagation) {
                d.stopPropagation()
            } else {
                window.event.cancelBubble = true
            }
        },
        _panBox: function () {
            if (!this._opts.enableAutoPan) {
                return
            }
            var i = parseInt(this._map.getContainer().offsetHeight, 10),
                o = parseInt(this._map.getContainer().offsetWidth, 10),
                j = this._boxHeight,
                d = this._boxWidth;
            if (j >= i || d >= o) {
                return
            }
            if (!this._map.getBounds().containsPoint(this._point)) {
                this._map.setCenter(this._point)
            }
            var e = this._map.pointToPixel(this._point),
                p, m, l, g = d / 2 - e.x,
                n = d / 2 + e.x - o;
            if (this._marker) {
                var k = this._marker.getIcon()
            }
            switch (this._opts.align) {
                case INFOBOX_AT_TOP:
                    var f = this._marker ? k.anchor.height + this._marker.getOffset().height - k.infoWindowAnchor
                        .height : 0;
                    p = j - e.y + this._opts.offset.height + f + 2;
                    break;
                case INFOBOX_AT_BOTTOM:
                    var f = this._marker ? -k.anchor.height + k.infoWindowAnchor.height + this._marker.getOffset()
                        .height + this._opts.offset.height : 0;
                    m = j + e.y - i + f + 4;
                    break
            }
            panX = g > 0 ? g : (n > 0 ? -n : 0);
            l = p > 0 ? p : (m > 0 ? -m : 0);
            this._map.panBy(panX, l)
        },
        _removeMarkerEvt: function () {
            this._markerDragend && this._marker.removeEventListener("dragend", this._markerDragend);
            this._markerDragging && this._marker.removeEventListener("dragging", this._markerDragging);
            this._markerDragend = this._markerDragging = null
        },
        _dispatchEvent: function (d, e, g) {
            e.indexOf("on") != 0 && (e = "on" + e);
            var f = new a.lang.Event(e);
            if (!!g) {
                for (var h in g) {
                    f[h] = g[h]
                }
            }
            d.dispatchEvent(f)
        }
    })
})();